package com.circle.model.util;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.SQLException;

public class DbUtil {
    private static HikariDataSource dataSource;

    static {
        HikariConfig config = new HikariConfig();
        // 基本配置
        config.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        config.setJdbcUrl(ResourceUtil.getDBConfig("jdbc.url.dcc"));
        config.setUsername(ResourceUtil.getDBConfig("jdbc.username.dcc"));
        config.setPassword(ResourceUtil.getDBConfig("jdbc.password.dcc"));

        // 连接池配置
        config.setMinimumIdle(5);                 // 最小空闲连接数
        config.setMaximumPoolSize(10);            // 最大连接数
        config.setAutoCommit(true);               // 自动提交
        config.setIdleTimeout(30000);             // 空闲超时时间
        config.setMaxLifetime(1800000);           // 连接最大生命周期
        config.setConnectionTimeout(30000);        // 连接超时时间
        config.setPoolName("HikariPool-SQLServer");// 连接池名称

        // 测试连接
        config.setConnectionTestQuery("SELECT 1");

        dataSource = new HikariDataSource(config);
    }

    /**
     * 获取数据库连接
     */
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    /**
     * 关闭连接池
     */
    public static void closePool() {
        if (dataSource != null && !dataSource.isClosed()) {
            dataSource.close();
        }
    }

    /**
     * 更新数据库配置
     */
    public static void updateConfig(String url, String username, String password) {
        // 关闭现有连接池
        closePool();

        // 创建新配置
        HikariConfig config = new HikariConfig();
        config.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        config.setJdbcUrl(url);
        config.setUsername(username);
        config.setPassword(password);

        // 连接池配置
        config.setMinimumIdle(5);
        config.setMaximumPoolSize(10);
        config.setAutoCommit(true);
        config.setIdleTimeout(30000);
        config.setMaxLifetime(1800000);
        config.setConnectionTimeout(30000);
        config.setPoolName("HikariPool-SQLServer");
        config.setConnectionTestQuery("SELECT 1");

        // 创建新的数据源
        dataSource = new HikariDataSource(config);
    }

    /**
     * 测试连接
     */
    public static boolean testConnection() {
        try (Connection conn = getConnection()) {
            return conn != null && !conn.isClosed();
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 测试连接并返回详细信息
     */
    public static String testConnectionWithDetails() {
        try (Connection conn = getConnection()) {
            if (conn != null && !conn.isClosed()) {
                StringBuilder info = new StringBuilder();
                info.append("数据库连接成功！\n");
                info.append("数据库产品名称: ").append(conn.getMetaData().getDatabaseProductName()).append("\n");
                info.append("数据库版本: ").append(conn.getMetaData().getDatabaseProductVersion()).append("\n");
                info.append("JDBC驱动版本: ").append(conn.getMetaData().getDriverVersion()).append("\n");
                info.append("当前数据库: ").append(conn.getCatalog());
                return info.toString();
            }
            return "连接创建成功，但状态异常";
        } catch (SQLException e) {
            return "连接失败: " + e.getMessage();
        }
    }

    /**
     * 获取连接池状态信息
     */
    public static String getPoolStats() {
        if (dataSource != null) {
            return String.format(
                "活动连接数: %d\n空闲连接数: %d\n总连接数: %d",
                dataSource.getHikariPoolMXBean().getActiveConnections(),
                dataSource.getHikariPoolMXBean().getIdleConnections(),
                dataSource.getHikariPoolMXBean().getTotalConnections()
            );
        }
        return "连接池未初始化";
    }
}